home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C++ / Frameworks / Sprocket Framework DR2 / Sprocket Framework / Preferences.cp < prev    next >
Text File  |  1996-06-15  |  5KB  |  232 lines

  1. /*
  2.  
  3.     File:        Preferences.cp
  4.     Project:    Sprocket Framework 1.1 (DR2), released 6/15/96
  5.     Contains:    Routine to open/create a prefs file
  6.     To Do:        Provide full preferences file support, including reading/writing
  7.                 This may become a sub-class of TFile
  8.  
  9.     Sprocket Major Contributors:
  10.     ----------------------------
  11.     Dave Falkenburg, producer of Sprocket 1.0
  12.     Bill Hayden,     producer of Sprocket 1.1
  13.     Steve Sisak,     producer of the upcoming Sprocket 2.0
  14.     
  15.     Pete Alexander        Steve Falkenburg    Randy Thelen
  16.     Eric Berdahl        Nitin Ganatra        Chris K. Thomas
  17.     Marshall Clow        Dave Hershey        Leonard Rosenthal
  18.     Tim Craycroft        Dave Mark            Dean Yu
  19.     David denBoer        Gary Powell
  20.     Cameron Esfahani    Jon Summers            Apple Computer, Inc.
  21.         
  22.     Comments, Additions, or Corrections:
  23.     ------------------------------------
  24.     Bill Hayden, Nikol Software <nikol@codewell.com>
  25.  
  26. */
  27.  
  28.  
  29. #include "Preferences.h"
  30. #include "SprocketMacros.h"
  31. #include "SprocketConstants.h"
  32. #include "UString.h"
  33. #include "UResources.h"
  34.  
  35. #include <Processes.h>
  36.  
  37.  
  38. #define kPrefID        128
  39.  
  40.  
  41. /*****************************************************************************/
  42.  
  43.  
  44.  
  45. TPreferencesFile::TPreferencesFile()
  46. {
  47. }
  48.  
  49.  
  50.  
  51. /*****************************************************************************/
  52.  
  53.  
  54.  
  55. OSErr        TPreferencesFile::OpenPreferencesFile(Boolean CreateIfNotFound)
  56. {
  57.     OSErr            err;
  58.     short            prefsVRefNum;
  59.     long            prefsDirID;
  60.     HParamBlockRec    pb;
  61.     Str255            prefsFileName;
  62.     
  63.     
  64.     err = RMCurResFileCompat(&fAppResFile);
  65.     
  66.     if (err != noErr)
  67.         return err;
  68.     
  69.     err = FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
  70.                         &prefsVRefNum, &prefsDirID);
  71.  
  72.     if (err != noErr)    //    Couldn’t find preferences folder, something is wrong
  73.         return err;
  74.  
  75.     GetIndString(prefsFileName, kPreferencesFileStrings, kPreferencesFileName);
  76.  
  77.     //    Try opening the Preferences file
  78.             
  79.     fPrefResFile = HOpenResFile(prefsVRefNum, prefsDirID, prefsFileName, fsRdWrPerm); 
  80.     if ( (fPrefResFile == -1) && CreateIfNotFound )
  81.         {
  82.         //    Get the application’s creator
  83.         
  84.         ProcessInfoRec        processInfo;
  85.         ProcessSerialNumber    currentProc = {0, kCurrentProcess};
  86.         
  87.         processInfo.processInfoLength = sizeof(ProcessInfoRec);
  88.         processInfo.processName = nil;
  89.         processInfo.processAppSpec = nil;
  90.         
  91.         err = GetProcessInformation(¤tProc, &processInfo);
  92.         if (err)
  93.             return err;
  94.         
  95.         //    Couldn’t open prefs file, try making a new one
  96.         
  97.         HCreateResFile(prefsVRefNum, prefsDirID, prefsFileName);
  98.         pb.fileParam.ioNamePtr = prefsFileName;
  99.         pb.fileParam.ioVRefNum = prefsVRefNum;
  100.         pb.fileParam.ioDirID = prefsDirID;
  101.         pb.fileParam.ioFDirIndex = 0;
  102.         err = PBHGetFInfoSync(&pb);
  103.         
  104.         pb.fileParam.ioNamePtr = prefsFileName;
  105.         pb.fileParam.ioVRefNum = prefsVRefNum;
  106.         pb.fileParam.ioDirID = prefsDirID;
  107.         pb.fileParam.ioFDirIndex = 0;
  108.         pb.fileParam.ioFlFndrInfo.fdType = 'pref';
  109.         pb.fileParam.ioFlFndrInfo.fdCreator = processInfo.processSignature;
  110.         pb.fileParam.ioFlFndrInfo.fdFlags = 0;
  111.         err = PBHSetFInfoSync(&pb); 
  112.     
  113.         if (!err && (ResError() == noErr))    //    Try opening the newly created prefs file if we made it
  114.             fPrefResFile = HOpenResFile(prefsVRefNum, prefsDirID, prefsFileName, fsRdWrPerm);            
  115.         }
  116.         
  117.     if (fPrefResFile != -1)
  118.         RMUseResFileCompat(fAppResFile);
  119.         
  120.     return err;
  121. }
  122.  
  123.  
  124.  
  125. /*****************************************************************************/
  126.  
  127.  
  128.  
  129.  
  130. OSErr        TPreferencesFile::ClosePreferencesFile(void)
  131. {
  132.     OSStatus    status = noErr;
  133.     OSStatus    status2;
  134.     
  135.     if (fPrefResFile != -1)
  136.         {
  137.         status = RMCloseResFileCompat(fPrefResFile);
  138.         
  139.         fPrefResFile = -1;
  140.         }
  141.         
  142.     status2 = RMUseResFileCompat(fAppResFile);
  143.     
  144.     if (status)
  145.         return status;
  146.         
  147.     return status2;
  148. }
  149.  
  150.  
  151. /*****************************************************************************/
  152.  
  153.  
  154.  
  155. OSErr        TPreferencesFile::ExtractPreference(ResType PreferenceType, Handle& PreferenceHandle)
  156. {
  157.     try
  158.         {
  159.         FailErr(RMUseResFileCompat(fPrefResFile));
  160.     
  161.         FailErr(RMGetIndexedResourceCompat(PreferenceType, 1, true /* oneDeep */,
  162.                                                                 true /* resLoad */,
  163.                                                                     &PreferenceHandle));
  164.         
  165.         FailNil(PreferenceHandle);
  166.         }
  167.     catch(OSErr err)
  168.         {
  169.         RMUseResFileCompat(fAppResFile);
  170.         return err;        // this error is more useful than the one from RMUseResFileCompat()
  171.         }
  172.  
  173.     return RMUseResFileCompat(fAppResFile);
  174. }
  175.  
  176.  
  177.  
  178. /*****************************************************************************/
  179.  
  180.  
  181.  
  182. OSErr        TPreferencesFile::SavePreference(ResType PreferenceType, Handle& PreferenceHandle)
  183. {
  184.     try
  185.         {
  186.         UInt32    count;
  187.         
  188.         FailErr(RMUseResFileCompat(fPrefResFile));
  189.         FailResErrorOrNil(PreferenceHandle);
  190.         
  191.         FailErr(RMCountResourcesCompat(PreferenceType, true /* oneDeep */, &count));
  192.         
  193.         if ( count > 0 )
  194.             {
  195.             FailErr(RMChangedResourceCompat(PreferenceHandle));
  196.             }
  197.         else
  198.             {
  199.             ResFileRefNum refNum;
  200.             
  201.             FailErr(RMHomeResFileCompat(PreferenceHandle, &refNum));
  202.             
  203.             if (refNum != fPrefResFile)
  204.                 FailErr(RMAddResourceCompat(PreferenceHandle, PreferenceType, kPrefID, "\p"));
  205.             }
  206.             
  207.         FailErr(RMUpdateResFileCompat(fPrefResFile));
  208.         }
  209.     catch(OSErr err)
  210.         {
  211.         RMUseResFileCompat(fAppResFile);
  212.         return err;        // this error is more useful than the one from RMUseResFileCompat()
  213.         }
  214.  
  215.     return RMUseResFileCompat(fAppResFile);
  216. }
  217.  
  218.  
  219.  
  220. /*****************************************************************************/
  221.  
  222.  
  223.  
  224. TPreferencesFile::~TPreferencesFile()
  225. {
  226.     this->ClosePreferencesFile();
  227. }
  228.  
  229.  
  230.  
  231. /*****************************************************************************/
  232.